package com.ldk.framework.service;

import java.util.List;
import java.util.Map;

import com.ldk.framework.entity.*;
import org.springframework.data.domain.Pageable;

import com.ldk.base.framework.service.IBaseService;

/**
 * ServiceTripService接口类
 *
 * @author xiangwl
 */
public interface IServiceTripService extends IBaseService<ServiceTrip> {
    /**
     * 估算费用
     *
     * @param dbKey
     * @param serviceCode
     * @param carType
     * @param roadId
     * @param startLon
     * @param startLat
     * @param endLon
     * @param endLat
     * @param crewCount
     * @param mapKey      百度地图KEY
     * @param areaCode    所属地区运价配置
     * @return {success, fee, distance, duration}
     */
    Map<String, Object> estimateFee(String dbKey, String serviceCode, String carType,
                                    Long roadId, Double startLon, Double startLat, Double endLon,
                                    Double endLat, Integer crewCount, String mapKey,String areaCode);

    /**
     * 根据起点经纬度和目的地点经纬度搜索相似的司机行程
     *
     * @param dbKey
     * @param parms {serviceCode,userType,status,roadId,startLon,startLat,endLon,endLat,scope,goTime,carRank,carSeats}
     * @return
     */
    List<ServiceTrip> searchTripList(String dbKey, Map<String, Object> parms, Pageable pageable);

    /**
     * 根据行程单号查询行程列表
     *
     * @param dbKey
     * @param query
     * @param tripNoList
     * @return
     */
    List<ServiceTrip> selectListIn(String dbKey, ServiceTrip query, List<String> tripNoList);

    /**
     * 根据行程单号批量修改行程信息，ps:主要用于统一修改行程状态
     *
     * @param dbKey
     * @param entity     修改行程实体参数
     * @param tripNoList 行程单号列表
     * @return
     */
    int updateIn(String dbKey, ServiceTrip entity, List<String> tripNoList);

    /**
     * 获取用户每天取消行程数
     *
     * @param dbKey
     * @param query
     * @return
     */
    long getDayCancelCount(String dbKey, ServiceTrip query);

    /**
     * 司机发布行程
     *
     * @param dbKey
     * @param driverTrip 司机行程
     * @return
     * @throws Exception
     */
    Boolean driverPublishTrip(String dbKey, ServiceTrip driverTrip) throws Exception;

    /**
     * 司机取消自己发布的行程
     *
     * @param dbKey
     * @param driverTrip
     * @return
     * @throws Exception
     */
    Boolean driverCancelTrip(String dbKey, ServiceTrip driverTrip) throws Exception;


    /**
     * 司机取消用户行程
     *
     * @param dbKey
     * @param driverTrip
     * @param userTrip
     * @param tripCrew
     * @return
     * @throws Exception
     */
    Boolean driverCancelUserTrip(String dbKey, ServiceTrip driverTrip, ServiceTrip userTrip, ServiceTripCrews tripCrew) throws Exception;

    /**
     * 行程发布后 系统自动派单
     *
     * @param dbKey
     * @param entity 订单对象
     * @return
     * @throws Exception
     */
    Boolean pushTripToDriver(String dbKey, final ServiceTrip entity) throws Exception;

    /**
     * 支付完成专线快车行程定金
     *
     * @param dbKey
     * @param outTradeNo 行程号
     * @param payTradeNo 支付方式平台的订单编号
     * @param tenpay     微信支付记录实体
     * @param alipay     支付宝支付记录实体
     * @return
     * @throws Exception
     */
    Boolean payTripDeposit(String dbKey, String outTradeNo, String payTradeNo, Tenpay tenpay, Alipay alipay) throws Exception;

    /**
     * 支付完成专线快车行程
     *
     * @param dbKey
     * @param outTradeNo 行程单号
     * @param payTradeNo 支付方式平台的订单编号
     * @param tenpay     微信支付记录实体
     * @param alipay     支付宝支付记录实体
     * @return
     * @throws Exception
     */
    Boolean payTrip(String dbKey, String outTradeNo, String payTradeNo, Tenpay tenpay, Alipay alipay, Unionpay unionpay) throws Exception;

    /**
     * 司机拒绝用户行程
     *
     * @param dbKey
     * @param driverOpenId 司机openId
     * @param userTrip     用户行程
     * @param reason       拒绝原因
     * @return
     * @throws Exception
     */
    Boolean driverRefuse(String dbKey, String driverOpenId, ServiceTrip userTrip, String reason) throws Exception;

    /**
     * 司机确认行程发车
     *
     * @param dbKey
     * @param trip  司机行程
     * @param crews 司机行程乘客
     * @return
     * @throws Exception
     */
    Boolean driverSureGo(String dbKey, ServiceTrip trip, List<ServiceTripCrews> crews) throws Exception;

    /**
     * 司机到达乘客上车地点
     *
     * @param dbKey
     * @param trip      司机行程
     * @param tripCrews 行程订单
     * @return
     * @throws Exception
     */
    Boolean driverArriveStartAdd(String dbKey, ServiceTrip trip, List<ServiceTripCrews> tripCrews) throws Exception;


    /**
     * 司机确认用户上车
     *
     * @param dbKey
     * @param driverTrip 司机订单
     * @param userTrip   用户行程
     * @return
     * @throws Exception
     */
    Boolean driverSureUserOnCar(String dbKey, ServiceTrip driverTrip, ServiceTrip userTrip, List<ServiceTripCrews> tripCrews) throws Exception;


    /**
     * 司机确认用户下车
     *
     * @param dbKey
     * @param driverTrip 司机订单
     * @param userTrip   用户行程
     * @return
     * @throws Exception
     */
    Boolean driverSureUserOffCar(String dbKey, ServiceTrip driverTrip, ServiceTrip userTrip, List<ServiceTripCrews> tripCrews) throws Exception;

    /**
     * 司机发起支付
     *
     * @param dbKey
     * @param driverTrip 司机订单
     * @return
     * @throws Exception
     */
    Boolean driverSurePay(String dbKey, ServiceTrip driverTrip, ServiceTrip userTrip, List<ServiceTripCrews> tripCrews, Double roadPrice, Double parkPrice) throws Exception;

    /**
     * 司机完成行程，
     *
     * @param dbKey
     * @param trip  司机行程
     * @return
     * @throws Exception
     */
    Boolean driverCompleteTrip(String dbKey, ServiceTrip trip) throws Exception;


    /**
     * 快车、专车支付后完成行程，
     *
     * @param dbKey
     * @param userTrip  用户行程
     * @return
     * @throws Exception
     */
    Boolean paySuccessCompleteTrip(String dbKey, ServiceTrip userTrip) throws Exception;

    /**
     * 用户评价行程
     *
     * @param dbKey
     * @param trip    用户行程
     * @param star    星级
     * @param content 内容
     * @return
     * @throws Exception
     */
    Boolean userComment(String dbKey, ServiceTrip trip, int star, String content) throws Exception;

    /**
     * 司机评价行程
     *
     * @param dbKey
     * @param trip    用户行程
     * @param star    星级
     * @param content 内容
     * @return
     * @throws Exception
     */
    Boolean driverComment(String dbKey, ServiceTrip trip, String userOpenId, int star, String content) throws Exception;

    /**
     * 行程过期
     *
     * @param dbKey
     * @param trip
     * @return
     * @throws Exception
     */
    Boolean tripExpired(String dbKey, ServiceTrip trip) throws Exception;

    /**
     * 自动匹配行程
     *
     * @param dbKey
     * @param userTrip 用户行程
     * @return
     * @throws Exception
     */
    Boolean timerMatchTrip(String dbKey, ServiceTrip userTrip) throws Exception;
}
